#include <16f628a.h>            //pic a utilizar          
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador 
#use delay (clock=4000000) //Fosc=20Mhz
#include<kbd2.c>               //libreria manejo keypad
#include <stdlib.h>         //Libreria de manego de string
#use standard_io(A)// entrada y salida del puerto A estandar


///DEFINICION DE FUNCIONES
void nueva_clave(void);         //funcion que cambia clave
void comprueba_clave(void);      //funcion que comprueba clave

///VARIABLES GLOBALES
char clave[16],string[16],c,limit;
signed char i,x;
boolean var=0;
float comprovarClave,password,nuevoPassword;
int a;

///PROGRAMA
void main(void)
{
   for(;;){   //bucle...
      
     do{               //espera hasta...
         c=kbd_getc();   
         }while(c==0);   //...pulsar una tecla
         
         if(a==1){ nuevoPassword=password;}
         else{password=123456;}
      
       
      if(c=='B')         //ve a introducir nueva clave
         nueva_clave();
      
      if(c=='A')         //ve a comprobar clave
         comprueba_clave();
                   
      }      //...infinito
}
///FUNCION CAMBIAR CLAVE
void nueva_clave(void){

   for(i=0;i<16;i++){
   output_high(PIN_A0);
   output_high(PIN_A1);
      do{               //espera hasta...
         c=kbd_getc();   
         }while(c==0);   //...pulsar una tecla
         
      if(c=='D'){      //si se pulsa D se sale de la funcion
      if(comprovarClave==password){a=1;
              output_high(PIN_A0);
              output_low(PIN_A1);
              delay_ms(1500);
              break;}
              
         else{            //no se sale...
             output_low(PIN_A0);
             output_high(PIN_A1);
             delay_ms(500);
            i=-1;
            continue;         //...hasta poner una clave valida
            }
                        //salir de funcion nueva_clave
         }
      
      limit=i+1;                //longitud de la clave
      clave[i]=c;               //almacena clave(maximo 16 caracteres)
      comprovarClave=atof(clave);
      }
      
            
      for(x=0;x<16;x++){
         output_high(PIN_A0);
         output_high(PIN_A1);

      do{               //espera hasta...
         c=kbd_getc();   
         }while(c==0);   //...pulsar una tecla
         
      if(c=='D'){      //si se pulsa D se sale de la funcion
      nuevoPassword=password;
      
         if(x==0){            //no se sale...
         output_low(PIN_A0);
         output_high(PIN_A1);
            delay_ms(1000);
 
            x=-1;
            continue;         //...hasta poner una clave valida
            }
         output_high(PIN_A0);
         output_low(PIN_A1);
         delay_ms(1000);
         break;               //salir de funcion nueva_clave
         }

      limit=x+1;               //longitud de la clave
      string[x]=c;               //almacena clave(maximo 16 caracteres)
      nuevoPassword=atof(string);
      }       
         output_low(PIN_A0);
         output_low(PIN_A1); 
}
///FUNCION COMPROBAR CLAVE
void comprueba_clave(void){
         output_high(PIN_A2);
         output_high(PIN_A3);
   for(x=0;;x++){   //bucle no sale...
      do{               //espera hasta...
         c=kbd_getc();   
         }while(c==0);   //...pulsar una tecla
 
      if(c=='D'){      //si se pulsa D se sale de la funcion
         if(x==0){            //no se sale...

            delay_ms(500);

            x=-1;
            continue;
            }         //...poner una clave valida
         if(x!=limit)   //para ser correcto debe tener tb longitud correcta
            var=1;
         break;         //salimos si se pulsa tecla * o #
         }
      
      if(c!=string[x])      //comprobacion de caracteres correctos
         var=1;         //No es correcto->clave incorrecta
       
      }         //...hasta pulsar * o #
      
   if(var>0){      //Clave incorrecta
   
         output_low(PIN_A2);
         output_high(PIN_A3);
     /* lcd_putc("\fClave\nIncorrecta!");
      output_high(PIN_A3);
      delay_ms(500);
      output_low(PIN_A3);*/
      }
   else{         //Clave correcta
         
         output_high(PIN_A2);
         output_low(PIN_A3);
     /* lcd_putc("\fClave\nCorrecta!");
      output_high(PIN_A5);
      delay_ms(500);
      output_low(PIN_A5);*/
      }
   var=0;         //reset var
}